#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>

int tickets = 1000; // 共享资源

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// cond 条件变量不能单独使用，必须搭配互斥量
// 因为条件变量无法确定互斥关系
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *start_routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        pthread_mutex_lock(&mutex); // 加锁

        pthread_cond_wait(&cond, &mutex); // 直接让线程在条件变量下进行等待
        // 判断先省略 -- 仅仅作为测试
        std::cout << name << " -> " << tickets << std::endl;
        tickets--;

        pthread_mutex_unlock(&mutex); // 解锁
    }
}

int main()
{
    // 要实现的现象：通过条件变量来控制线程执行
    pthread_t t[5];
    for (int i = 0; i < 5; i++)
    {
        char *name = new char[64];
        snprintf(name, 64, "thread %d",i+1);
        // 创建线程
        pthread_create(t + i, nullptr, start_routine, name);
    }

    while (true)
    {
        sleep(1);
        // 唤醒处于cond等待队列中的线程
        // pthread_cond_signal(&cond); // 一次唤醒一个线程
        pthread_cond_broadcast(&cond); // 一次唤醒所有线程
        std::cout << "main thread wakeup one thread ..." << std::endl;
    }

    for (int i = 0; i < 5; i++)
    {
        pthread_join(t[i], nullptr); // 线程退出
    }

    return 0;
}